/*
给定 N 个闭区间 [ai,bi] 以及一个线段区间 [s,t]，请你选择尽量少的区间，将指定线段区间完全覆盖。

输出最少区间数，如果无法完全覆盖则输出 −1。

输入格式
第一行包含两个整数 s 和 t，表示给定线段区间的两个端点。

第二行包含整数 N，表示给定区间数。

接下来 N 行，每行包含两个整数 ai,bi，表示一个区间的两个端点。

输出格式
输出一个整数，表示所需最少区间数。

如果无解，则输出 −1。

数据范围
1≤N≤105,
−109≤ai≤bi≤109,
−109≤s≤t≤109
输入样例：
1 5
3
-1 3
2 4
3 5
输出样例：
2
*/
#include <iostream>
#include <algorithm>

using namespace std;
const int N = 1e5 + 10;
typedef pair<int, int> PII;
PII range[N];

int n, res = 0;

bool my_sort(PII a, PII b)
{
    return a.first < b.first;
}
int main(int argc, char const *argv[])
{
    int start, end;
    cin >> start >> end;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> range[i].first >> range[i].second;
    sort(range, range + n, my_sort);
    // 按照左端点从下到大排序 然后
    // 不断的从剩下的所有范围中选取右端点最大的范围的右端点跟新 求解范围的左端点
    bool success = false;
    for (int i = 0; i < n; i++)
    {
        int j = i, r = -2e9;

        while (j < n && range[j].first <= start)
        {
            r = max(r, range[j].second);
            j++;
        }
        if (r < start)
        {
            res = -1;
            break;
        }
        res++;
        if (r >= end)
        {
            success = true;
            break;
        }
        start = r;
        i = j - 1;
    }
    if (!success)
        res = -1;

    cout << res << endl;
    return 0;
}
